import random

def no_repeat_choice_gen(seq):
    '''No repeat choice is similar to random.choice, but different calls to this 
    function can't return the same element. This functions returns a generator.'''
    # Make a copy of the sequence, so we don't alter the existing one
    seq = list(seq)
    try:
        while True:
            element = random.choice(seq)
            yield element
    except IndexError:
        raise StopIteration

def no_repeat_choice(seq):
    '''Same as no_repeat_choice_gen, but this function DOES alter 
    the sequence you send, so it's destructive. This is for the function to have
    a very similar interface to random.choice'''
    return seq.pop(random.randrange(len(seq)))